package com.bt7274.service;

import com.bt7274.pojo.bo.PromotionBO;
import com.bt7274.pojo.bo.PromotionUpdateBO;
import com.bt7274.pojo.bo.UserParticipateBO;
import com.bt7274.pojo.vo.*;
import com.bt7274.utils.PageResponse;

import java.util.List;

/**
 * 促销活动服务接口
 * @author galland
 */
public interface PromotionService {

    /**
     * 创建新的促销活动
     *
     * @param promotionBO: 新促销活动的信息
     * @return String
     * @author galland
     */
    String createPromotion(PromotionBO promotionBO);

    /**
     * 更新促销活动
     *
     * @param promotionUpdateBO: 促销活动信息
     * @return boolean：是否更新成功
     * @author galland
     */
    void updatePromotion(PromotionUpdateBO promotionUpdateBO);

    /**
     * 通过ID获取促销活动信息
     *
     * @param promotionId: 促销活动标识
     * @return PromotionBO
     * @author galland
     */
    PromotionVO getPromotionById(String promotionId);

    /**
     * 启用或禁用促销活动
     *
     * @param id: 促销活动ID
     * @return boolean
     * @author galland
     */
    void togglePromotionStatus(String id, Integer isActive);


    /**
     * 删除促销活动
     *
     * @param promotionId: 促销活动ID
     * @author galland
     */
    void deletePromotion(String promotionId);

    /**
     * 分页获取促销活动
     *
     * @param current:
     * @param size:
     * @param type:
     * @param isActive:
     * @return PageResponse<PromotionListVO>
     * @author galland
     */
    PageResponse<PromotionListVO> getPromotionList(Integer current, Integer size, String type, Integer isActive);

    // ================用户功能=====================

    /**
     * 获取当前有效的促销活动（用户）
     *
     * @return List<PromotionBO> :促销活动列表
     * @author galland
     */
    List<PromotionListVO> getActivePromotions();

    /**
     * 获取用户可以参加的用户列表
     *
     * @param userId: 用户ID
     * @return List<UserPromotionVO>
     * @author galland
     */
    List<UserPromotionVO> getAvailablePromotions(String userId);

    /**
     * 用户参加活动
     *
     * @param participateBO: 参与信息
     * @return String
     * @author galland
     */
    String participatePromotion(UserParticipateBO participateBO);

    /**
     * 获取活动参与记录
     * @param promotionId 活动ID
     * @param current 当前页
     * @param size 每页大小
     * @return 参与记录列表
     */
    PageResponse<ActivityRecordVO> getActivityRecords(String promotionId, Integer current, Integer size);

    /**
     * 检查用户是否已经参加某活动
     *
     * @param userId: 用户ID
     * @param promotionId: 活动ID
     * @return boolean: 是否已经参加
     * @author galland
     */
    boolean hasParticipated(String userId, String promotionId);

    /**
     * 获取用户的活动参与记录
     *
     * @param userId: 用户ID
     * @param current: 当前页
     * @param size: 每页大小
     * @return PageResponse<ActivityRecordVO>参与记录
     * @author galland
     */
    PageResponse<ActivityRecordVO> getUserActivityRecords(String userId, Integer current, Integer size);

//    /**
//     * 应用促销策略到种子
//     *
//     * @param torrentId: 种子ID
//     * @param promotionPolicySlug: 促销策略slug
//     * @return void
//     * @author galland
//     */
//    void applyPromotionToTorrent(String torrentId, String promotionPolicySlug);

    /**
     * 应用促销策略到用户
     *
     * @param userId: 用户ID
     * @param promotionPolicyId: 促销策略ID
     * @return void
     * @author galland
     */
    void applyPromotionToUser(String userId, Long promotionPolicyId);
}
